﻿using AgencyEntityLib.BaseEntity;
using System.Web.UI;
using System.Web.UI.WebControls;
using FormControllers;
using SqlLibrary;
using Ecopsy.DataTier;
using Ecopsy.Tools;
using System;
using System.Linq ;
using System.Collections.Generic;
using Ecopsy.DataTier.SqlLibrary;

/// <summary>
/// Базовый класс всех страничек 
/// - содержит ресурсы справочников
/// - инструменты используемые на страничках 
/// </summary>
public class iPageController : System.Web.UI.Page
{
    public iPageController()
    {    
    }

    /// <summary>
    /// Возвращает справочник указанного DictionaryTypeID
    /// </summary>
    /// <param name="DictionaryTypeID"></param>
    /// <returns></returns>
    public static EntityList GetDictionary(string DictionaryTypeID)
    {
        DictionaryItemList list = new DictionaryItemList();
        list.DictionaryTypeID = DictionaryTypeID;
        list.Load();
        return list;
    }

    public static  TreeDictionaryContext TreeDictionaryContext
    {
        get { return new TreeDictionaryContext(); }
    }

    /// <summary>
    /// Прописывает скрипт на событие OnChange. По событию - выводиться предупреждение -Есть несохраненные данные
    /// </summary>
    /// <param name="Coll"></param>
    /// <param name="ControlName"></param>
    /// <param name="EventName"></param>
    /// <param name="AttachedFunction"></param>
    protected void SetAlertForTextBox(ControlCollection Coll,string ControlName , string EventName, string AttachedFunction)
    {
        foreach (Control item in Coll)
        {
            if (item.Controls.Count > 0) SetAlertForTextBox(item.Controls,ControlName,EventName, AttachedFunction + ";");
            if (item.GetType().FullName.IndexOf(ControlName) > -1) 
            {   
                WebControl f = (WebControl)item;
                f.Attributes.Add(EventName, AttachedFunction + ";");                
            }
        }
    }

    public static  void SetAlertForTextBox_Static(ControlCollection Coll, string ControlName, string EventName, string AttachedFunction)
    {
        foreach (Control item in Coll)
        {
            if (item.Controls.Count > 0) SetAlertForTextBox_Static(item.Controls, ControlName, EventName, AttachedFunction + ";");
            if (item.GetType().FullName.IndexOf(ControlName) > -1)
            {
                WebControl f = (WebControl)item;
                f.Attributes.Add(EventName, AttachedFunction + ";");
            }
        }
    }


    
    /// <summary>
    /// Определить по карте доступна ли данная страница для текущего пользователя
    /// </summary>
    /// <param name="UrlKey"></param>
    /// <returns></returns>
    protected bool UserInrolesForUrl(string UrlKey)
    {
        bool isEnabled = true;
        GlobalConstants.CurrentAgency.SetPageUrl(ref UrlKey, ref isEnabled);
        return isEnabled;
    }
    
    /// <summary>
    /// Установить страницу по Agency.SiteMap и ее доступность текущему пользователю
    /// </summary>
    /// <param name="UrlKey">Id странички без .aspx </param>
    /// <param name="isEnabled"></param>
    public static  void SetPageUrl(ref string UrlKey, ref bool isEnabled)
    {
        GlobalConstants.CurrentAgency.SetPageUrl(ref UrlKey, ref isEnabled);
    }

    /// <summary>
    ///  проверить текущего пользователя в роли
    /// </summary>
    /// <param name="RoleName"></param>
    /// <returns></returns>
    public static  bool UserInRole(string RoleName)
    {
        return  GlobalConstants.CurrentEmployeer.IsInRole(new string [] {RoleName});     
    }
    
    /// <summary>
    ///  Проверить возможна ли работа текущего пользователя с элементом сайта заданным SiteMapItemKey
    /// </summary>
    /// <param name="RoleName"></param>
    /// <returns></returns>
    public static bool UserInRoleForSiteMapItem(string SiteMapItemKey)
    {
        SiteMapItem SiteItem = (SiteMapItem)GlobalConstants.CurrentAgency.SitMap.FindItem(SiteMapItemKey);
        if(null==SiteItem)  return true ;        
        return GlobalConstants.CurrentEmployeer.IsInRole(SiteItem.ConvertRolesToArray());
    }
    
    /// <summary>
    /// Выяснить является ли запись новой
    /// </summary>
    /// <param name="RecordID"></param>
    /// <returns></returns>
    public static bool IsNewRecord(string RecordID) { return RecordID.IndexOf(GlobalConstants.qPrefNEW_RECORD) > -1; }

    

    #region Функциональность списка    
    protected delegate void fDataBind();
    protected delegate void fWhere();

    private string _KeyPref = string.Empty;
    /// <summary>
    /// Префикс ключа даных формы в сессии :  
    /// Правило: _KeyPref+this.GetType ().ToString()+ this.User.Identity.Name
    /// </summary>
    protected  virtual string Key {
        get { return _KeyPref+this.GetType ().ToString()+ this.User.Identity.Name; }     
        set { _KeyPref = value; }
    }

    

    protected  virtual ListWhere f_Where(ListLoadStatment ListLoadStatment, string DefSortField) 
    {        
            ListWhere r = null;
            if (!CacheTools.IsSessionCacheObject(Key))
            {
                r = new ListWhere();
                r.ListLoadStatment = ListLoadStatment;
                r.SortCondition.SortDirection = SortDirection.Ascending;
                r.SortCondition.SortField = DefSortField;
                CacheTools.SetSessionCacheObject(Key, r);
            }                    
            return (ListWhere)CacheTools.GetSessionCacheObect(Key);      

    }

    protected virtual void  f_SetWhere(ListWhere value)
    {
          CacheTools.ResetSessionCache(Key);
          CacheTools.SetSessionCacheObject(Key, value);
    }

    



   /// <summary>
   /// Where списсочных форм
   /// </summary>
    protected virtual ListWhere Where
    {
        get;
        set;
    }
        
    protected void f_lvSort(object sender, ListView lv, fDataBind fMyDtaBind)
    {
        lv.EditIndex = -1;
        string SortField = ((LinkButton)sender).CommandArgument;
        Where.SortCondition.SortDirection = (Where.SortCondition.SortDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending); ;
        Where.SortCondition.SortField = SortField;
        fMyDtaBind();
    }
    /// <summary>
    /// Заголовок сортировки
    /// </summary>
    /// <param name="HearTd"></param>
    /// <returns></returns>
    protected virtual  string GetHeadCss(string HearTd)
    {
        if (Where.SortCondition.SortField != HearTd) return string.Empty;
        return "sort" + Where.SortCondition.SortDirection.ToString();
    }
    #endregion

    
    /// <summary>
    /// Вернуть список сотрудников  
    /// </summary>
    /// <param name="DepartmentID">Департамент </param>
    /// <param name="FormatWithPosition">выводить сотрудника + подразделение /должность</param>
    /// <param name="WithChildsDepartnment">Выводить сотрудников дочерних подразделений </param>
    /// <returns></returns>
    public static ListItemCollection GetEmplList(string DepartmentID, bool FormatWithPosition, bool WithChildsDepartnment)
    {
        Agency a = GlobalConstants.CurrentAgency;
        Department d = a.GetDepartment(DepartmentID);
        List<Employeer> l = a.GetEmplList(true, d);
        Employeer[] arr = l.ToArray(); 


        
        var sl =
            from w in l 
            orderby w.FirstName 
            select w;
        

        ListItemCollection res = new ListItemCollection();
               
        /// в режиме с дочерними подразделениями 
        if (WithChildsDepartnment)
        {

            foreach (Employeer item in sl.ToArray ())
            {
                ListItem i = new ListItem();
                i.Text =  (WithChildsDepartnment?item.GetFullNameWithDepartmentPosition(): item.ShortName);
                i.Value = item.ID;
                i.Selected = (GlobalConstants.CurrentEmployeer.ID == item.ID);
                res.Add(i);
            }
        }
        else
        {
            ListItem i = new ListItem();
            i.Text = GlobalConstants.CurrentEmployeer.ShortName;
            i.Value = GlobalConstants.CurrentEmployeer.ID;
            i.Selected = true;
            res.Add(i);
        }

        

        return res;
    }


    /// <summary>
    /// Вернуть источник для дерева представляющего RadioButton CheckBoxTree
    /// </summary>
    /// <param name="Dictionary"> Древовидный справочник</param>
    /// <param name="F"> Функция разрешающая - нажат/отжат CheckBox</param>
    /// <param name="_NodeClass"> Класс метка для чекбоксов данного дерева </param>
    /// <param name="_HfId">Скрытое поле содержащее выделенный элемент</param>
    /// <returns></returns>
    public  static F_TreeDataSource Get_RbCheckBox_TreeSource(
                                                    TreeEntitySingle TreeSource,
                                                    Func<TreeEntitySingle, bool> F_IsChecked,
                                                    string _NodeClass,
                                                    string _HfId
                                                    )
    {
        // Инициализировать RbCheckBox 
        TreeNodeFormatter_Rb.TreeRbContext f = new TreeNodeFormatter_Rb.TreeRbContext()
        {
            DivClass = "",
            NodeClass = _NodeClass,
            HfId = _HfId,
            // опредеить функцию решающую нажат чек бокс или нет            
            OnChBind = F_IsChecked

        };



        // определить делегат поставляющий класс определяющий формат ноды в дереве
        Func<TreeEntitySingle, F_TreeDataSource.F_TreeDataSourceView.F_TreeHierarchyData> formatter = delegate(TreeEntitySingle _tr)
        {

            return (F_TreeDataSource.F_TreeDataSourceView.F_TreeHierarchyData)new TreeNodeFormatter_Rb(_tr, f);
        };

        // сформировать источник данных виз. элемента

        return new F_TreeDataSource(TreeSource, formatter);

    }
    /// <summary>
    /// Вернуть источник для дерева представляющего RadioButton CheckBoxTree
    /// </summary>
    /// <param name="TreeSource"> Древовидный источник</param>
    /// <param name="F_IsChecked">Функция решающая нажат чекбокс или нет</param>
    /// <param name="NodeFormatter">Класс форматирующий ноду</param>
    /// <param name="_NodeClass">Метка - css цепляющийся к ноде</param>
    /// <param name="_HfId">Поле хранения выбранного элемента</param>
    /// <returns></returns>
    public static F_TreeDataSource Get_RbCheckBox_TreeSource(
                                                   TreeEntitySingle TreeSource,
                                                   Func<TreeEntitySingle, bool> F_IsChecked,
                                                   Func<TreeEntitySingle,TreeNodeFormatter_Rb.TreeRbContext,TreeNodeFormatter_Rb> F_NodeFormatter, 
                                                   string _NodeClass,
                                                   string _HfId
                                                   )
    {
        // Инициализировать RbCheckBox 
        TreeNodeFormatter_Rb.TreeRbContext f = new TreeNodeFormatter_Rb.TreeRbContext()
        {
            DivClass = "",
            NodeClass = _NodeClass,
            HfId = _HfId,
            // опредеить функцию решающую нажат чек бокс или нет            
            OnChBind = F_IsChecked

        };

        //// определить делегат поставляющий класс определяющий формат ноды в дереве
        Func<TreeEntitySingle, F_TreeDataSource.F_TreeDataSourceView.F_TreeHierarchyData> f_formatter = delegate(TreeEntitySingle _tr)
        {
            return (F_TreeDataSource.F_TreeDataSourceView.F_TreeHierarchyData) F_NodeFormatter( _tr, f);
        };

        // сформировать источник данных виз. элемента

        return new F_TreeDataSource(TreeSource, f_formatter);

    }
}




